home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / kn / sockcommon / returnservsockmsg.c < prev    next >
Encoding:
Text File  |  2001-05-12  |  2.2 KB  |  91 lines

  1.  
  2. /*
  3. **    msg = kn_returnservsockmsg(sock, msg)
  4. **
  5. **    return message to server socket.
  6. **
  7. */
  8.  
  9. TVOID kn_returnservsockmsg(TAPTR knsock, TMSG *msg)
  10. {
  11.     struct knservsocket *s = (struct knservsocket *) knsock;
  12.     knnetmsg *netmsg = (knnetmsg *) msg->sender;
  13.     struct knsrvnode *cnode = (struct knsrvnode *) netmsg->backptr;
  14.     kn_sockenv_t *sockenv = &s->sockenv;
  15.  
  16.     TRemove((TNODE *) cnode);        /* remove from userlandlist */
  17.  
  18.     if (netmsg->nethead.protocol == KNSOCK_PROTO_PUTREPLY)
  19.     {
  20.         switch (msg->status)
  21.         {
  22.             case TMSG_STATUS_REPLIED:
  23.  
  24.                 cnode->bytestowrite = netmsg->nethead.msgsize;
  25.                 netmsg->nethead.msgsize = htonl(netmsg->nethead.msgsize);
  26.                 netmsg->nethead.protocol = KNSOCK_PROTO_REPLY;            /* reply message */
  27.     
  28.                 dbsprintf(3, "*** TEKLIB kn_returnservsockmsg: replymsg put to writelist\n");
  29.                 break;
  30.  
  31.             case TMSG_STATUS_ACKD:
  32.  
  33.                 cnode->bytestowrite = sizeof(knnethead);                /* send back header only */
  34.                 netmsg->nethead.msgsize = htonl(sizeof(knnethead));        
  35.                 netmsg->nethead.protocol = KNSOCK_PROTO_ACK;            /* ack message */
  36.  
  37.                 TFreeMsg(cnode->bufmsg + 1);                            /* free msg body */
  38.  
  39.                 cnode->bufmsg = TNULL;
  40.     
  41.                 dbsprintf(3, "*** TEKLIB kn_returnservsockmsg: ackmsg put to writelist\n");
  42.                 break;
  43.  
  44.             case TMSG_STATUS_FAILED:
  45.  
  46.                 /*FD_CLR(cnode->desc, &s->readset);*/
  47.  
  48.                 TFreeMsg(cnode->bufmsg + 1);
  49.  
  50.                 cnode->bufmsg = TNULL;
  51.                 
  52.                 kn_locksock(sockenv);
  53.                 shutdown(cnode->desc, 2);
  54.                 kn_closesocket(cnode->desc);
  55.                 kn_unlocksock(sockenv);
  56.  
  57.                 TAddTail(&s->freelist, (TNODE *) cnode);
  58.  
  59.                 dbsprintf(5, "*** TEKLIB kn_returnservsockmsg: returned failed message\n");
  60.  
  61.                 return;
  62.             
  63.             default:
  64.  
  65.                 dbsprintf(20, "*** TEKLIB returnservsocket: unknown message status\n");
  66.     
  67.                 TFreeMsg(cnode->bufmsg + 1);
  68.                     
  69.                 TAddTail(&s->freelist, (TNODE *) cnode);
  70.                 return;
  71.         }
  72.  
  73.         netmsg->nethead.version = KNSOCK_VERSION;
  74.  
  75.         cnode->bytesdone = 0;
  76.         FD_SET(cnode->desc, &s->writeset);
  77.         TAddTail(&s->writelist, (TNODE *) cnode);
  78.     }
  79.     else
  80.     {
  81.         TFreeMsg(cnode->bufmsg + 1);
  82.  
  83.         cnode->bufmsg = TNULL;
  84.         cnode->bytesdone = 0;
  85.         FD_SET(cnode->desc, &s->readset);
  86.         TAddTail(&s->readlist, (TNODE *) cnode);
  87.  
  88.         dbsprintf(3, "*** TEKLIB: kn_returnservsockmsg: returned one-way msg\n");
  89.     }
  90. }
  91.